package com.chunlin.testinterface.cloneable;

//在Object中有一个clone方法,可以用于创建并返回当前对象的副本
//Cloneable 是一个标记接口（Marker Interface），没有任何方法。它的作用是通过继承表明一个类具有某种特性，即它的对象可以被安全地克隆
//Object 类中的 clone 方法会检查调用对象是否实现了 Cloneable 接口
//如果对象没有实现 Cloneable 接口，clone 方法会抛出 CloneNotSupportedException 异常。这种检查机制可以防止不安全的克隆操作
//PS:重写clone接口,可以对访问限定符的权限进行放大,放大成public

//子类允许扩大访问权限：
//可以将父类的protected方法重写为public
//可以将父类的default方法（包级访问权限）重写为protected或public
//目的是为了增加方法的可见性，使子类提供的方法可以被更多的客户端代码访问

//子类不允许缩小访问权限：
//不能将父类的public方法重写为protected、default或private
//不能将父类的protected方法重写为default或private
//不能将父类的default方法重写为private

public class Person implements Cloneable{
    public Money money = new Money();

    //浅拷贝
//    @Override
//    public Object clone() throws CloneNotSupportedException {
//        return super.clone();
//    }


    @Override
    public Object clone() throws CloneNotSupportedException {
        Person cloned = (Person) super.clone();
        //直到这里this的person1和cloned是属于不同的对象的引用,只不过里面的money是同一个对象的引用


        cloned.money = (Money) money.clone();
        //将cloned对象的引用改变成一个新的对象的引用,这样就完成了深拷贝
        //这里可以理解一个现象,就是这个clone方法可以改变对象本身的引用,也就是一个新的对象
        // 但是对于对象中的成员变量,如果是一个引用类型,那么就不能进行改变
        //这个成员变量需要调用属于他自己的clone方法
        return cloned;
    }
}
